package com.ktjy.test;

import java.lang.reflect.*;
import java.util.concurrent.ConcurrentHashMap;

public class AccessPersonConstructors {
    public static void main(String[] args) {
        try {
            //示例6
            //加载类Person
            Class clz = Class.forName("com.ktjy.mapper.Person");
            //调用Person类的无参构造创建Person实例
            Object obj = clz.newInstance();
            //调用Person实例的toString()方法 属性为默认
//            System.out.println(obj);
//
//
//            //示例7
//            //获取Person无参构造 public Person()
//            Constructor c1 = clz.getDeclaredConstructor();
//            //Person的无参构造器为public 可以直接访问
////            System.out.println(c1.toGenericString());
//            obj = c1.newInstance();
//            System.out.println(obj);
//
//            //获取Person的单参构造  private Person(String name)
//            Constructor c2 = clz.getDeclaredConstructor(String.class);
//            //Person的单参构造器为private 不能直接访问
//            //通过setAccessible(true)方法可以访问
//            c2.setAccessible(true);
//            obj = c2.newInstance("马嘉祺我们喜欢你");
//            System.out.println(obj);
//
//            //获取person的三参数构造
//            Constructor c3 = clz.getDeclaredConstructor(String.class, String.class, String.class);
//            //Person的三参构造器为protected 不能直接访问
//            // 通过setAccessible(true)方法可以访问
//            c3.setAccessible(true);
//            obj = c3.newInstance("马嘉祺", "我们", "喜欢你");
//            System.out.println(obj);
//
//

//            示例8
//            //获取private String name 属性
//            Field name =clz.getDeclaredField("name");
//            //name属性为private  不可访问 通过setAccessible(true)方法可以访问
//            name.setAccessible(true);
//            //先取值看一下
//            System.out.println("赋值前的name:   "+name.get(obj));
//            //为name属性赋值
//            name.set(obj,"马嘉祺");
//             System.out.println("赋值后的name:   "+name.get(obj));

            // 示例9
            //根据方法名和参数列表获取 static final int getAge() 方法
            //没有参数可以不用写或者null表示
            Method getAge = clz.getDeclaredMethod("getAge", null);
            //getAge方法为default方法 不能直接访问 通过setAccessible(true)方法可以访问
             getAge.setAccessible(true);
             //调用getAge方法并传入参数
            obj=getAge.invoke( null, null);
            System.out.println("年龄是:   "+obj);

            Object person = clz.newInstance(); // 创建一个Person对象

            //根据方法名和参数列表获取private void setName(String name)方法
            Method silenMethod=clz.getDeclaredMethod("silebtMethod" ,null);
            //silenMethod方法为private 不能直接访问 通过setAccessible(true)方法可以访问
            silenMethod .setAccessible(true);
            //调用 silenMethod方法并传入参数
            silenMethod.invoke(person,null);

            // 获取private String name属性
                Method setName =clz.getDeclaredMethod("setName",String.class);
                setName.invoke( person,"New ");
                obj =clz.getDeclaredMethod( "getName").invoke( person);
                 System.out.println("name属性值是:   "+obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
